package org.android.brasil.projetos.oktoberfest2011.persistencia;

import org.android.brasil.projetos.oktoberfest2011.persistencia.util.InsercaoRapidaDeApresentacao;
import org.android.brasil.projetos.oktoberfest2011.persistencia.util.InsercaoRapidaDeHorarios;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Classe para comunicação com o banco de dados. Realiza todas as operações de
 * criação, inserção, remoção, atualização e consulta.
 * 
 * @author Júlio
 * 
 */
public class OktoberfestDbAdapter {
	public static final String DB_NAME = "oktoberfest";
	public static final int DB_VERSION = 7;

	private static final String TAG = "OktoberfestDbAdapter";
	private static DatabaseHelper mDbHelper;

	private OktoberfestDbAdapter() {

	}

	/**
	 * Esta inner class é responsável pelos controles de criação, atualização e
	 * instanciação do gerenciador do banco de dados.
	 * 
	 * @author Júlio
	 * 
	 */
	private static class DatabaseHelper extends SQLiteOpenHelper {

		public DatabaseHelper(Context context) {
			super(context, DB_NAME, null, DB_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {

			db.execSQL(ApresentacaoDAO.CREATE_TABLE);
			db.execSQL(HorarioDAO.CREATE_TABLE);
			new InsercaoRapidaDeApresentacao(db);
			new InsercaoRapidaDeHorarios(db);
			Log.w("CRIANDO O DB", "DB CRIADO!");

		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion
					+ ", which will destroy all old data");
			String[] tabelas = { 
					ApresentacaoDAO.TABELA_APRESENTACAO, HorarioDAO.TABELA_HORARIOS};

			if(oldVersion < 5){
				for (int i = 0; i < tabelas.length; ++i) {
					db.execSQL(" DROP TABLE " + tabelas[i]);
				}

				onCreate(db);
			}
		}
	}

	/**
	 * Abre o banco de dados. Se não puder ser aberto, tenta criar uma nova
	 * instância do banco. Se não puder ser criada, lança uma exceção para
	 * sinalizar a falha.
	 * 
	 * @return this (auto-referência, permitindo encadear métodos na
	 *         inicialização).
	 * @throws SQLException
	 *             se o banco não puder ser criado ou instanciado.
	 */
	public static SQLiteDatabase open(Context ctx) throws SQLException {
		mDbHelper = new DatabaseHelper(ctx);
		return mDbHelper.getWritableDatabase();
	}

	public static void close() {
		mDbHelper.close();
	}

}
